<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/mutex.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/mutex.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="k">/*</span>
<a name="2" /><span class="True">       2:</span> <span class="k"> * Mutexes: blocking mutual exclusion locks</span>
<a name="3" /><span class="True">       3:</span> <span class="k"> *</span>
<a name="4" /><span class="True">       4:</span> <span class="k"> * started by Ingo Molnar:</span>
<a name="5" /><span class="True">       5:</span> <span class="k"> *</span>
<a name="6" /><span class="True">       6:</span> <span class="k"> *  Copyright (C) 2004, 2005, 2006 Red Hat, Inc., Ingo Molnar &lt;mingo@redhat.com&gt;</span>
<a name="7" /><span class="True">       7:</span> <span class="k"> *</span>
<a name="8" /><span class="True">       8:</span> <span class="k"> * This file contains the main data structure and API definitions.</span>
<a name="9" /><span class="True">       9:</span> <span class="k"> */</span>
<a name="10" /><span class="Maybe">      10:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_X19MSU5VWF9NVVRFWF9IXzA_"><span class="b">__LINUX_MUTEX_H</span></a>
<a name="11" /><span class="Maybe">      11:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19MSU5VWF9NVVRFWF9IXzA_"><span class="b">__LINUX_MUTEX_H</span></a>
<a name="12" /><span class="Maybe">      12:</span> 
<a name="13" /><span class="Maybe">      13:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><a href="cpu.c_macros_ref.html#_Y3VycmVudF8w"><span class="b">current</span></a><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="14" /><span class="Maybe">      14:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">list</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="15" /><span class="Maybe">      15:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">spinlock_types</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="16" /><span class="Maybe">      16:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">linkage</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="17" /><span class="Maybe">      17:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">lockdep</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="18" /><span class="Maybe">      18:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">atomic</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="19" /><span class="Maybe">      19:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">processor</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="20" /><span class="Maybe">      20:</span> 
<a name="21" /><span class="Maybe">      21:</span> <span class="k">/*</span>
<a name="22" /><span class="Maybe">      22:</span> <span class="k"> * Simple, straightforward mutexes with strict semantics:</span>
<a name="23" /><span class="Maybe">      23:</span> <span class="k"> *</span>
<a name="24" /><span class="Maybe">      24:</span> <span class="k"> * - only one task can hold the mutex at a time</span>
<a name="25" /><span class="Maybe">      25:</span> <span class="k"> * - only the owner can unlock the mutex</span>
<a name="26" /><span class="Maybe">      26:</span> <span class="k"> * - multiple unlocks are not permitted</span>
<a name="27" /><span class="Maybe">      27:</span> <span class="k"> * - recursive locking is not permitted</span>
<a name="28" /><span class="Maybe">      28:</span> <span class="k"> * - a mutex object must be initialized via the API</span>
<a name="29" /><span class="Maybe">      29:</span> <span class="k"> * - a mutex object must not be initialized via memset or copying</span>
<a name="30" /><span class="Maybe">      30:</span> <span class="k"> * - task may not exit with mutex held</span>
<a name="31" /><span class="Maybe">      31:</span> <span class="k"> * - memory areas where held locks reside must not be freed</span>
<a name="32" /><span class="Maybe">      32:</span> <span class="k"> * - held mutexes must not be reinitialized</span>
<a name="33" /><span class="Maybe">      33:</span> <span class="k"> * - mutexes may not be used in hardware or software interrupt</span>
<a name="34" /><span class="Maybe">      34:</span> <span class="k"> *   contexts such as tasklets and timers</span>
<a name="35" /><span class="Maybe">      35:</span> <span class="k"> *</span>
<a name="36" /><span class="Maybe">      36:</span> <span class="k"> * These semantics are fully enforced when DEBUG_MUTEXES is</span>
<a name="37" /><span class="Maybe">      37:</span> <span class="k"> * enabled. Furthermore, besides enforcing the above rules, the mutex</span>
<a name="38" /><span class="Maybe">      38:</span> <span class="k"> * debugging code also implements a number of additional features</span>
<a name="39" /><span class="Maybe">      39:</span> <span class="k"> * that make lock debugging easier and faster:</span>
<a name="40" /><span class="Maybe">      40:</span> <span class="k"> *</span>
<a name="41" /><span class="Maybe">      41:</span> <span class="k"> * - uses symbolic names of mutexes, whenever they are printed in debug output</span>
<a name="42" /><span class="Maybe">      42:</span> <span class="k"> * - point-of-acquire tracking, symbolic lookup of function names</span>
<a name="43" /><span class="Maybe">      43:</span> <span class="k"> * - list of all locks held in the system, printout of them</span>
<a name="44" /><span class="Maybe">      44:</span> <span class="k"> * - owner tracking</span>
<a name="45" /><span class="Maybe">      45:</span> <span class="k"> * - detects self-recursing locks and prints out all relevant info</span>
<a name="46" /><span class="Maybe">      46:</span> <span class="k"> * - detects multi-task circular deadlocks and prints out all affected</span>
<a name="47" /><span class="Maybe">      47:</span> <span class="k"> *   locks and tasks (and only those tasks)</span>
<a name="48" /><span class="Maybe">      48:</span> <span class="k"> */</span>
<a name="49" /><span class="Maybe">      49:</span> <span class="m">struct</span> <span class="b">mutex</span> <span class="f">{</span>
<a name="50" /><span class="Maybe">      50:</span>     <span class="k">/* 1: unlocked, 0: locked, negative: locked, possible waiters */</span>
<a name="51" /><span class="Maybe">      51:</span>     <span class="b">atomic_t</span>        <span class="b">count</span><span class="f">;</span>
<a name="52" /><span class="Maybe">      52:</span>     <span class="b">spinlock_t</span>        <span class="b">wait_lock</span><span class="f">;</span>
<a name="53" /><span class="Maybe">      53:</span>     <span class="m">struct</span> <span class="b">list_head</span>    <span class="b">wait_list</span><span class="f">;</span>
<a name="54" /><span class="Maybe">      54:</span> <span class="f">#</span><span class="n">if</span> <span class="b">defined</span><span class="f">(</span><span class="b">CONFIG_DEBUG_MUTEXES</span><span class="f">)</span> <span class="f">||</span> <span class="b">defined</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_Q09ORklHX1NNUF8w"><span class="b">CONFIG_SMP</span></a><span class="f">)</span>
<a name="55" /><span class="Maybe">      55:</span>     <span class="m">struct</span> <span class="b">task_struct</span>    <span class="f">*</span><span class="b">owner</span><span class="f">;</span>
<a name="56" /><span class="Maybe">      56:</span> <span class="f">#</span><span class="n">endif</span>
<a name="57" /><span class="Maybe">      57:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX01VVEVYX1NQSU5fT05fT1dORVJfMA__"><span class="b">CONFIG_MUTEX_SPIN_ON_OWNER</span></a>
<a name="58" /><span class="Maybe">      58:</span>     <span class="m">void</span>            <span class="f">*</span><span class="b">spin_mlock</span><span class="f">;</span>    <span class="k">/* Spinner MCS lock */</span>
<a name="59" /><span class="Maybe">      59:</span> <span class="f">#</span><span class="n">endif</span>
<a name="60" /><span class="False">      60:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_DEBUG_MUTEXES</span>
<a name="61" /><span class="False">      61:</span>     <span class="m">const</span> <span class="m">char</span>         <span class="f">*</span><span class="b">name</span><span class="f">;</span>
<a name="62" /><span class="False">      62:</span>     <span class="m">void</span>            <span class="f">*</span><span class="b">magic</span><span class="f">;</span>
<a name="63" /><span class="Maybe">      63:</span> <span class="f">#</span><span class="n">endif</span>
<a name="64" /><span class="False">      64:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_DEBUG_LOCK_ALLOC</span>
<a name="65" /><span class="False">      65:</span>     <span class="m">struct</span> <span class="b">lockdep_map</span>    <span class="b">dep_map</span><span class="f">;</span>
<a name="66" /><span class="Maybe">      66:</span> <span class="f">#</span><span class="n">endif</span>
<a name="67" /><span class="Maybe">      67:</span> <span class="f">}</span><span class="f">;</span>
<a name="68" /><span class="Maybe">      68:</span> 
<a name="69" /><span class="Maybe">      69:</span> <span class="k">/*</span>
<a name="70" /><span class="Maybe">      70:</span> <span class="k"> * This is the control structure for tasks blocked on mutex,</span>
<a name="71" /><span class="Maybe">      71:</span> <span class="k"> * which resides on the blocked task&apos;s kernel stack:</span>
<a name="72" /><span class="Maybe">      72:</span> <span class="k"> */</span>
<a name="73" /><span class="Maybe">      73:</span> <span class="m">struct</span> <span class="b">mutex_waiter</span> <span class="f">{</span>
<a name="74" /><span class="Maybe">      74:</span>     <span class="m">struct</span> <span class="b">list_head</span>    <span class="b">list</span><span class="f">;</span>
<a name="75" /><span class="Maybe">      75:</span>     <span class="m">struct</span> <span class="b">task_struct</span>    <span class="f">*</span><span class="b">task</span><span class="f">;</span>
<a name="76" /><span class="False">      76:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_DEBUG_MUTEXES</span>
<a name="77" /><span class="False">      77:</span>     <span class="m">void</span>            <span class="f">*</span><span class="b">magic</span><span class="f">;</span>
<a name="78" /><span class="Maybe">      78:</span> <span class="f">#</span><span class="n">endif</span>
<a name="79" /><span class="Maybe">      79:</span> <span class="f">}</span><span class="f">;</span>
<a name="80" /><span class="Maybe">      80:</span> 
<a name="81" /><span class="False">      81:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_DEBUG_MUTEXES</span>
<a name="82" /><span class="False">      82:</span> <span class="f">#</span> <span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">mutex</span><span class="f">-</span><span class="b">debug</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="83" /><span class="Maybe">      83:</span> <span class="f">#</span><span class="n">else</span>
<a name="84" /><span class="Maybe">      84:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19ERUJVR19NVVRFWF9JTklUSUFMSVpFUl8w"><span class="b">__DEBUG_MUTEX_INITIALIZER</span></a><span class="f">(</span><span class="b">lockname</span><span class="f">)</span>
<a name="85" /><span class="Maybe">      85:</span> <span class="k">/**</span>
<a name="86" /><span class="Maybe">      86:</span> <span class="k"> * mutex_init - initialize the mutex</span>
<a name="87" /><span class="Maybe">      87:</span> <span class="k"> * @mutex: the mutex to be initialized</span>
<a name="88" /><span class="Maybe">      88:</span> <span class="k"> *</span>
<a name="89" /><span class="Maybe">      89:</span> <span class="k"> * Initialize the mutex to unlocked state.</span>
<a name="90" /><span class="Maybe">      90:</span> <span class="k"> *</span>
<a name="91" /><span class="Maybe">      91:</span> <span class="k"> * It is not allowed to initialize an already locked mutex.</span>
<a name="92" /><span class="Maybe">      92:</span> <span class="k"> */</span>
<a name="93" /><span class="Maybe">      93:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_bXV0ZXhfaW5pdF8w"><span class="b">mutex_init</span></a><span class="f">(</span><span class="b">mutex</span><span class="f">)</span> \
<a name="94" /><span class="Maybe">      94:</span> <span class="m">do</span> <span class="f">{</span>                            \
<a name="95" /><span class="Maybe">      95:</span>     <span class="m">static</span> <span class="m">struct</span> <span class="b">lock_class_key</span> <span class="b">__key</span><span class="f">;</span>        \
<a name="96" /><span class="Maybe">      96:</span>                             \
<a name="97" /><span class="Maybe">      97:</span>     <span class="b">__mutex_init</span><span class="f">(</span><span class="f">(</span><span class="b">mutex</span><span class="f">)</span><span class="f">,</span> <span class="f">#</span><span class="b">mutex</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">__key</span><span class="f">)</span><span class="f">;</span>        \
<a name="98" /><span class="Maybe">      98:</span> <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="99" /><span class="Maybe">      99:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">mutex_destroy</span><span class="f">(</span><span class="m">struct</span> <span class="b">mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">)</span> <span class="f">{</span><span class="f">}</span>
<a name="100" /><span class="Maybe">     100:</span> <span class="f">#</span><span class="n">endif</span>
<a name="101" /><span class="Maybe">     101:</span> 
<a name="102" /><span class="False">     102:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_DEBUG_LOCK_ALLOC</span>
<a name="103" /><span class="False">     103:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19ERVBfTUFQX01VVEVYX0lOSVRJQUxJWkVSXzA_"><span class="b">__DEP_MAP_MUTEX_INITIALIZER</span></a><span class="f">(</span><span class="b">lockname</span><span class="f">)</span> \
<a name="104" /><span class="False">     104:</span>         <span class="f">,</span> <span class="f">.</span><span class="b">dep_map</span> <span class="f">=</span> <span class="f">{</span> <span class="f">.</span><span class="b">name</span> <span class="f">=</span> <span class="f">#</span><span class="b">lockname</span> <span class="f">}</span>
<a name="105" /><span class="Maybe">     105:</span> <span class="f">#</span><span class="n">else</span>
<a name="106" /><span class="Maybe">     106:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19ERVBfTUFQX01VVEVYX0lOSVRJQUxJWkVSXzA_"><span class="b">__DEP_MAP_MUTEX_INITIALIZER</span></a><span class="f">(</span><span class="b">lockname</span><span class="f">)</span>
<a name="107" /><span class="Maybe">     107:</span> <span class="f">#</span><span class="n">endif</span>
<a name="108" /><span class="Maybe">     108:</span> 
<a name="109" /><span class="Maybe">     109:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19NVVRFWF9JTklUSUFMSVpFUl8w"><span class="b">__MUTEX_INITIALIZER</span></a><span class="f">(</span><span class="b">lockname</span><span class="f">)</span> \
<a name="110" /><span class="Maybe">     110:</span>         <span class="f">{</span> <span class="f">.</span><span class="b">count</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_QVRPTUlDX0lOSVRfMA__"><span class="b">ATOMIC_INIT</span></a><span class="f">(</span><span class="c">1</span><span class="f">)</span> \
<a name="111" /><span class="Maybe">     111:</span>         <span class="f">,</span> <span class="f">.</span><span class="b">wait_lock</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_X19TUElOX0xPQ0tfVU5MT0NLRURfMA__"><span class="b">__SPIN_LOCK_UNLOCKED</span></a><span class="f">(</span><span class="b">lockname</span><span class="f">.</span><span class="b">wait_lock</span><span class="f">)</span> \
<a name="112" /><span class="Maybe">     112:</span>         <span class="f">,</span> <span class="f">.</span><span class="b">wait_list</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TElTVF9IRUFEX0lOSVRfMA__"><span class="b">LIST_HEAD_INIT</span></a><span class="f">(</span><span class="b">lockname</span><span class="f">.</span><span class="b">wait_list</span><span class="f">)</span> \
<a name="113" /><span class="Maybe">     113:</span>         <a href="cpu.c_macros_ref.html#_X19ERUJVR19NVVRFWF9JTklUSUFMSVpFUl8w"><span class="b">__DEBUG_MUTEX_INITIALIZER</span></a><span class="f">(</span><span class="b">lockname</span><span class="f">)</span> \
<a name="114" /><span class="Maybe">     114:</span>         <a href="cpu.c_macros_ref.html#_X19ERVBfTUFQX01VVEVYX0lOSVRJQUxJWkVSXzA_"><span class="b">__DEP_MAP_MUTEX_INITIALIZER</span></a><span class="f">(</span><span class="b">lockname</span><span class="f">)</span> <span class="f">}</span>
<a name="115" /><span class="Maybe">     115:</span> 
<a name="116" /><span class="Maybe">     116:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_REVGSU5FX01VVEVYXzA_"><span class="b">DEFINE_MUTEX</span></a><span class="f">(</span><span class="b">mutexname</span><span class="f">)</span> \
<a name="117" /><span class="Maybe">     117:</span>     <span class="m">struct</span> <span class="b">mutex</span> <span class="b">mutexname</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_X19NVVRFWF9JTklUSUFMSVpFUl8w"><span class="b">__MUTEX_INITIALIZER</span></a><span class="f">(</span><span class="b">mutexname</span><span class="f">)</span>
<a name="118" /><span class="Maybe">     118:</span> 
<a name="119" /><span class="Maybe">     119:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">__mutex_init</span><span class="f">(</span><span class="m">struct</span> <span class="b">mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">,</span> <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">name</span><span class="f">,</span>
<a name="120" /><span class="Maybe">     120:</span>              <span class="m">struct</span> <span class="b">lock_class_key</span> <span class="f">*</span><span class="b">key</span><span class="f">)</span><span class="f">;</span>
<a name="121" /><span class="Maybe">     121:</span> 
<a name="122" /><span class="Maybe">     122:</span> <span class="k">/**</span>
<a name="123" /><span class="Maybe">     123:</span> <span class="k"> * mutex_is_locked - is the mutex locked</span>
<a name="124" /><span class="Maybe">     124:</span> <span class="k"> * @lock: the mutex to be queried</span>
<a name="125" /><span class="Maybe">     125:</span> <span class="k"> *</span>
<a name="126" /><span class="Maybe">     126:</span> <span class="k"> * Returns 1 if the mutex is locked, 0 if unlocked.</span>
<a name="127" /><span class="Maybe">     127:</span> <span class="k"> */</span>
<a name="128" /><span class="Maybe">     128:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">mutex_is_locked</span><span class="f">(</span><span class="m">struct</span> <span class="b">mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">)</span>
<a name="129" /><span class="Maybe">     129:</span> <span class="f">{</span>
<a name="130" /><span class="Maybe">     130:</span>     <span class="m">return</span> <span class="b">atomic_read</span><span class="f">(</span><span class="f">&amp;</span><span class="b">lock</span><span class="f">-&gt;</span><span class="b">count</span><span class="f">)</span> <span class="f">!=</span> <span class="c">1</span><span class="f">;</span>
<a name="131" /><span class="Maybe">     131:</span> <span class="f">}</span>
<a name="132" /><span class="Maybe">     132:</span> 
<a name="133" /><span class="Maybe">     133:</span> <span class="k">/*</span>
<a name="134" /><span class="Maybe">     134:</span> <span class="k"> * See kernel/locking/mutex.c for detailed documentation of these APIs.</span>
<a name="135" /><span class="Maybe">     135:</span> <span class="k"> * Also see Documentation/mutex-design.txt.</span>
<a name="136" /><span class="Maybe">     136:</span> <span class="k"> */</span>
<a name="137" /><span class="False">     137:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_DEBUG_LOCK_ALLOC</span>
<a name="138" /><span class="False">     138:</span> <span class="m">extern</span> <span class="m">void</span> <a href="cpu.c_macros_noref.html#_bXV0ZXhfbG9ja19uZXN0ZWRfMA__"><span class="b">mutex_lock_nested</span></a><span class="f">(</span><span class="m">struct</span> <span class="b">mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">subclass</span><span class="f">)</span><span class="f">;</span>
<a name="139" /><span class="False">     139:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">_mutex_lock_nest_lock</span><span class="f">(</span><span class="m">struct</span> <span class="b">mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">,</span> <span class="m">struct</span> <span class="b">lockdep_map</span> <span class="f">*</span><span class="b">nest_lock</span><span class="f">)</span><span class="f">;</span>
<a name="140" /><span class="False">     140:</span> 
<a name="141" /><span class="False">     141:</span> <span class="m">extern</span> <span class="m">int</span> <a href="cpu.c_macros_ref.html#_X19tdXN0X2NoZWNrXzE_"><span class="b">__must_check</span></a> <a href="cpu.c_macros_noref.html#_bXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlX25lc3RlZF8w"><span class="b">mutex_lock_interruptible_nested</span></a><span class="f">(</span><span class="m">struct</span> <span class="b">mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">,</span>
<a name="142" /><span class="False">     142:</span>                     <span class="m">unsigned</span> <span class="m">int</span> <span class="b">subclass</span><span class="f">)</span><span class="f">;</span>
<a name="143" /><span class="False">     143:</span> <span class="m">extern</span> <span class="m">int</span> <a href="cpu.c_macros_ref.html#_X19tdXN0X2NoZWNrXzE_"><span class="b">__must_check</span></a> <a href="cpu.c_macros_noref.html#_bXV0ZXhfbG9ja19raWxsYWJsZV9uZXN0ZWRfMA__"><span class="b">mutex_lock_killable_nested</span></a><span class="f">(</span><span class="m">struct</span> <span class="b">mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">,</span>
<a name="144" /><span class="False">     144:</span>                     <span class="m">unsigned</span> <span class="m">int</span> <span class="b">subclass</span><span class="f">)</span><span class="f">;</span>
<a name="145" /><span class="False">     145:</span> 
<a name="146" /><span class="False">     146:</span> <span class="f">#</span><span class="n">define</span> <span class="b">mutex_lock</span><span class="f">(</span><span class="b">lock</span><span class="f">)</span> <a href="cpu.c_macros_noref.html#_bXV0ZXhfbG9ja19uZXN0ZWRfMA__"><span class="b">mutex_lock_nested</span></a><span class="f">(</span><span class="b">lock</span><span class="f">,</span> <span class="c">0</span><span class="f">)</span>
<a name="147" /><span class="False">     147:</span> <span class="f">#</span><span class="n">define</span> <span class="b">mutex_lock_interruptible</span><span class="f">(</span><span class="b">lock</span><span class="f">)</span> <a href="cpu.c_macros_noref.html#_bXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlX25lc3RlZF8w"><span class="b">mutex_lock_interruptible_nested</span></a><span class="f">(</span><span class="b">lock</span><span class="f">,</span> <span class="c">0</span><span class="f">)</span>
<a name="148" /><span class="False">     148:</span> <span class="f">#</span><span class="n">define</span> <span class="b">mutex_lock_killable</span><span class="f">(</span><span class="b">lock</span><span class="f">)</span> <a href="cpu.c_macros_noref.html#_bXV0ZXhfbG9ja19raWxsYWJsZV9uZXN0ZWRfMA__"><span class="b">mutex_lock_killable_nested</span></a><span class="f">(</span><span class="b">lock</span><span class="f">,</span> <span class="c">0</span><span class="f">)</span>
<a name="149" /><span class="False">     149:</span> 
<a name="150" /><span class="False">     150:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_bXV0ZXhfbG9ja19uZXN0X2xvY2tfMA__"><span class="b">mutex_lock_nest_lock</span></a><span class="f">(</span><span class="b">lock</span><span class="f">,</span> <span class="b">nest_lock</span><span class="f">)</span>                \
<a name="151" /><span class="False">     151:</span> <span class="m">do</span> <span class="f">{</span>                                    \
<a name="152" /><span class="False">     152:</span>     <a href="cpu.c_macros_ref.html#_dHlwZWNoZWNrXzA_"><span class="b">typecheck</span></a><span class="f">(</span><span class="m">struct</span> <span class="b">lockdep_map</span> <span class="f">*</span><span class="f">,</span> <span class="f">&amp;</span><span class="f">(</span><span class="b">nest_lock</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">dep_map</span><span class="f">)</span><span class="f">;</span>    \
<a name="153" /><span class="False">     153:</span>     <span class="b">_mutex_lock_nest_lock</span><span class="f">(</span><span class="b">lock</span><span class="f">,</span> <span class="f">&amp;</span><span class="f">(</span><span class="b">nest_lock</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">dep_map</span><span class="f">)</span><span class="f">;</span>        \
<a name="154" /><span class="False">     154:</span> <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="155" /><span class="False">     155:</span> 
<a name="156" /><span class="Maybe">     156:</span> <span class="f">#</span><span class="n">else</span>
<a name="157" /><span class="Maybe">     157:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">mutex_lock</span><span class="f">(</span><span class="m">struct</span> <span class="b">mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">)</span><span class="f">;</span>
<a name="158" /><span class="Maybe">     158:</span> <span class="m">extern</span> <span class="m">int</span> <a href="cpu.c_macros_ref.html#_X19tdXN0X2NoZWNrXzE_"><span class="b">__must_check</span></a> <span class="b">mutex_lock_interruptible</span><span class="f">(</span><span class="m">struct</span> <span class="b">mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">)</span><span class="f">;</span>
<a name="159" /><span class="Maybe">     159:</span> <span class="m">extern</span> <span class="m">int</span> <a href="cpu.c_macros_ref.html#_X19tdXN0X2NoZWNrXzE_"><span class="b">__must_check</span></a> <span class="b">mutex_lock_killable</span><span class="f">(</span><span class="m">struct</span> <span class="b">mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">)</span><span class="f">;</span>
<a name="160" /><span class="Maybe">     160:</span> 
<a name="161" /><span class="Maybe">     161:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_bXV0ZXhfbG9ja19uZXN0ZWRfMA__"><span class="b">mutex_lock_nested</span></a><span class="f">(</span><span class="b">lock</span><span class="f">,</span> <span class="b">subclass</span><span class="f">)</span> <span class="b">mutex_lock</span><span class="f">(</span><span class="b">lock</span><span class="f">)</span>
<a name="162" /><span class="Maybe">     162:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_bXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlX25lc3RlZF8w"><span class="b">mutex_lock_interruptible_nested</span></a><span class="f">(</span><span class="b">lock</span><span class="f">,</span> <span class="b">subclass</span><span class="f">)</span> <span class="b">mutex_lock_interruptible</span><span class="f">(</span><span class="b">lock</span><span class="f">)</span>
<a name="163" /><span class="Maybe">     163:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_bXV0ZXhfbG9ja19raWxsYWJsZV9uZXN0ZWRfMA__"><span class="b">mutex_lock_killable_nested</span></a><span class="f">(</span><span class="b">lock</span><span class="f">,</span> <span class="b">subclass</span><span class="f">)</span> <span class="b">mutex_lock_killable</span><span class="f">(</span><span class="b">lock</span><span class="f">)</span>
<a name="164" /><span class="Maybe">     164:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_bXV0ZXhfbG9ja19uZXN0X2xvY2tfMA__"><span class="b">mutex_lock_nest_lock</span></a><span class="f">(</span><span class="b">lock</span><span class="f">,</span> <span class="b">nest_lock</span><span class="f">)</span> <span class="b">mutex_lock</span><span class="f">(</span><span class="b">lock</span><span class="f">)</span>
<a name="165" /><span class="Maybe">     165:</span> <span class="f">#</span><span class="n">endif</span>
<a name="166" /><span class="Maybe">     166:</span> 
<a name="167" /><span class="Maybe">     167:</span> <span class="k">/*</span>
<a name="168" /><span class="Maybe">     168:</span> <span class="k"> * NOTE: mutex_trylock() follows the spin_trylock() convention,</span>
<a name="169" /><span class="Maybe">     169:</span> <span class="k"> *       not the down_trylock() convention!</span>
<a name="170" /><span class="Maybe">     170:</span> <span class="k"> *</span>
<a name="171" /><span class="Maybe">     171:</span> <span class="k"> * Returns 1 if the mutex has been acquired successfully, and 0 on contention.</span>
<a name="172" /><span class="Maybe">     172:</span> <span class="k"> */</span>
<a name="173" /><span class="Maybe">     173:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">mutex_trylock</span><span class="f">(</span><span class="m">struct</span> <span class="b">mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">)</span><span class="f">;</span>
<a name="174" /><span class="Maybe">     174:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">mutex_unlock</span><span class="f">(</span><span class="m">struct</span> <span class="b">mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">)</span><span class="f">;</span>
<a name="175" /><span class="Maybe">     175:</span> 
<a name="176" /><span class="Maybe">     176:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">atomic_dec_and_mutex_lock</span><span class="f">(</span><span class="b">atomic_t</span> <span class="f">*</span><span class="b">cnt</span><span class="f">,</span> <span class="m">struct</span> <span class="b">mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">)</span><span class="f">;</span>
<a name="177" /><span class="Maybe">     177:</span> 
<a name="178" /><span class="Maybe">     178:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_YXJjaF9tdXRleF9jcHVfcmVsYXhfMA__"><span class="b">arch_mutex_cpu_relax</span></a>
<a name="179" /><span class="Maybe">     179:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_ref.html#_YXJjaF9tdXRleF9jcHVfcmVsYXhfMA__"><span class="b">arch_mutex_cpu_relax</span></a><span class="f">(</span><span class="f">)</span> <span class="b">cpu_relax</span><span class="f">(</span><span class="f">)</span>
<a name="180" /><span class="Maybe">     180:</span> <span class="f">#</span><span class="n">endif</span>
<a name="181" /><span class="Maybe">     181:</span> 
<a name="182" /><span class="True">     182:</span> <span class="f">#</span><span class="n">endif</span>
<a name="183" /><span class="True">     183:</span> </pre>
  </body>
</html>
